#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Filename: export_as_excel_reverse.py
# Author: ChenChangSong
# Date: 2025-08-24

"""
功能描述: 导出为Excel，倒序
"""
import sys
import os
import time
from openpyxl import Workbook
from openpyxl.worksheet.datavalidation import DataValidation
from openpyxl.formatting.rule import CellIsRule
from openpyxl.styles import PatternFill, Alignment
# 不再添加项目路径到环境
from comm.common_code import *
from .export_as_excel_order import check_xmind_file_and_case_list

def export_to_excel_reverse(xmind_path, level=0):
    """执行所有方法
    :param xmind_path: XMind文件路径
    :param level: 目录层级0默认所有目录
    :return: 生成的Excel文件列表
    """
    # 将测试用例倒序
    results = check_xmind_file_and_case_list(xmind_path, level=level)
    if results:
        results.reverse()
    # 将结果写入Excel文件
    if results:
        files_list = test_case_write_to_excel(xmind_path, results)
        return files_list
    else:
        logger.error("没有提取到有效的测试用例数据")
        log_to_ui_error("没有提取到有效的测试用例数据")
        return []

def test_case_write_to_excel(xmind_path, row_data_list):
    """将测试用例数据写入Excel文件
    :param xmind_path: 原始xmind文件路径（用于生成输出文件名）
    :param row_data_list: 测试用例数据列表
    """
    # ============== 文件准备 ==============
    file_dir, file_name = os.path.split(xmind_path)
    file_base = os.path.splitext(file_name)[0]
    timestamp = time.strftime("%Y%m%d_%H%M%S")

    # 计算需要拆分的文件数量 (每500条数据一个文件)
    total_cases = len(row_data_list)
    # 修复文件数量计算逻辑
    num_files = (total_cases - 1) // 500 + 1  # 正确的向上取整方法

    print(f"总用例数: {total_cases}, 需要拆分成 {num_files} 个文件")  # 调试信息

    # 文件列表
    files_list = []
    # ============== 处理每个文件分片 ==============
    for file_index in range(num_files):
        # 计算当前分片的数据范围
        start_index = file_index * 500
        end_index = min((file_index + 1) * 500, total_cases)
        current_data = row_data_list[start_index:end_index]

        print(f"处理分片 {file_index + 1}: {len(current_data)}条数据")  # 调试信息

        wb = Workbook()
        ws = wb.active
        ws.title = "测试用例"  # 设置工作表名称

        # ============== 表头设置 ==============
        title_list = ['需求ID', '用例目录', '用例名称', '用例步骤', '预期结果', '执行结果', '备注']
        ws.append(title_list)
        ws.auto_filter.ref = "A1:G1"  # 设置自动筛选

        # ============== 列宽设置 ==============
        col_config = {
            'A': 8, 'B': 40, 'C': 25,
            'D': 80, 'E': 20, 'F': 10, 'G': 25
        }
        for col, width in col_config.items():
            ws.column_dimensions[col].width = width

        # ============== 数据验证设置 ==============
        status_options = ["通过", "失败", "阻塞", "未执行", "待确认", "用例待更新", "用例废弃"]
        dv = DataValidation(
            type="list",
            formula1=f'"{",".join(status_options)}"',
            allow_blank=True
        )
        ws.add_data_validation(dv)
        # 应用范围根据当前分片数据量计算
        if current_data:  # 确保有数据时才添加验证
            dv_range = f"F2:F{len(current_data) + 1}"
            dv.add(dv_range)

        # ============== 条件格式设置 ==============
        status_colors = {
            "通过": '00FF00',  # 绿色
            "失败": 'FF7F00',  # 橙色
            "阻塞": 'FF0000',  # 红色
            "未执行": 'FFFF00',  # 黄色
            "待确认": 'FFFF00',
            "用例待更新": 'FFFF00',
            "用例废弃": 'FFFF00'
        }
        if current_data:  # 确保有数据时才添加格式
            for status, color in status_colors.items():
                rule = CellIsRule(
                    operator='equal',
                    formula=[f'"{status}"'],
                    fill=PatternFill(
                        start_color=color,
                        end_color=color,
                        fill_type='solid'
                    )
                )
                # 应用范围根据当前分片数据量计算
                cf_range = f'F2:F{len(current_data) + 1}'
                ws.conditional_formatting.add(cf_range, rule)

        # ============== 写入测试数据 ==============
        for case_data in current_data:
            ws.append(case_data)

        # ============== 格式优化 ==============
        ws.freeze_panes = 'A2'  # 冻结首行

        # 设置所有单元格自动换行
        for row in ws.iter_rows(min_row=1):
            for cell in row:
                cell.alignment = Alignment(wrap_text=True, vertical='top')

        # 设置行高
        ws.row_dimensions[1].height = 20  # 标题行
        for row_idx in range(2, len(current_data) + 2):
            ws.row_dimensions[row_idx].height = 32  # 数据行

        # ============== 文件保存 ==============
        # 添加分片序号到文件名（当有多个文件时）
        if num_files > 1:
            suffix = f"_倒序_{timestamp}_{file_index + 1}"
        else:
            suffix = f"_倒序_{timestamp}"

        output_path = os.path.join(file_dir, f"{file_base}{suffix}.xlsx")

        # 确保输出目录存在
        os.makedirs(file_dir, exist_ok=True)

        try:
            wb.save(output_path)
            print(f"成功生成文件: {output_path} ({len(current_data)}条用例)")
            files_list.append(output_path)
        except PermissionError:
            print(f"权限错误: 无法写入文件 {output_path}，可能文件正在被其他程序打开")
        except Exception as e:
            print(f"保存文件 {output_path} 时出错: {str(e)}")

    print(f"总计生成 {num_files} 个文件，共处理 {total_cases} 条测试用例")
    return files_list


if __name__ == '__main__':
    # 获取示例文件路径
    from ui_code.common_ui import get_project_root
    xmind_path = get_project_root() / "files" / "【示例】商品详情qwer12345.xmind"
    
    # 执行所有方法
    export_to_excel_reverse(str(xmind_path), level=4)
